/*
 * GrupoEmisores.h
 *
 *  Created on: Feb 23, 2010
 *      Author: jgrande
 */

#ifndef _DIRECTORIO_UNIVERSO_H_
#define _DIRECTORIO_UNIVERSO_H_

#include <time.h>
#include <list>
#include <string>
#include <iostream>

#include "Planeta.h"

#include "../Common/CommonTypes.h"
#include "../Utiles/Posicion.h"

using std::list;
using std::string;

using middleware::common::T_ID_UNIVERSO;
using middleware::common::T_ID_PLANETA;
using middleware::common::Cantidad;
using middleware::common::Minutos;

namespace aplicacion {
namespace directorio {

class Universo {

	T_ID_UNIVERSO id;

	T_ID_PLANETA nextPlanetaId;

	Cantidad min, max;

	Minutos ttl;

	list<Planeta> planetas;

	string descripcion;

	bool abierto;

	bool ocupado;

	time_t horaCreacion;

public:

	Universo(T_ID_UNIVERSO id, Cantidad min, Cantidad max, Minutos ttl,
			string descripcion, bool abierto, bool ocupado, time_t horaCreacion);

	~Universo();

	T_ID_UNIVERSO getId() const { return id; }

	Cantidad getMin() const { return min; }

	Cantidad getMax() const { return max; }

	Minutos getTTL() const { return ttl; }

	string getDescripcion() const { return descripcion; }

	T_ID_PLANETA suscribir(Direccion dir, T_TAMANIO_PLANETA tamanio,
			Posicion posicion);

	bool_t desuscribir(T_ID_PLANETA idPlaneta);

	bool isAbierto() const { return abierto; }

	bool isOcupado() const { return ocupado; }

	void cerrar() { abierto = false; }

	void ocupar() { ocupado = true; }

	Minutos edad() const { return (time(NULL)-horaCreacion)/60; }

	unsigned int getCantidadEmisores() const { return planetas.size(); }

	const list<Planeta>& getPlanetas() const { return planetas; }

};

std::ostream& operator<<(std::ostream& os, const Universo& u);

}
}

#endif /* _DIRECTORIO_UNIVERSO_H_ */
